为 NW.js 编写测试用例


测试框架

NW.js 使用一个小巧的基于 Python 的测试框架,只有 3 个文件,您可以在 test 目录中查看源代码。

NW.js 中的每个测试用例都是一个可以运行的应用,所以您可以脱离框架手动运行。

在 NW.js 中,测试用例有两种类型:自动远程。参考下面 编写测试用例 部分的说明。

通过以下命令来运行测试用例:

python test/test.py -t 80 auto
python test/test.py -t 80 remoting

编写测试用例

自动测试用例

TODO

远程测试用例

远程测试用例由 ChromeDriver 驱动,通常这些测试用例涉及到用户交互,参考ChromeDriver 测试

远程测试用例需要应用根目录中有一个 test.py 文件。

这是 test.py 文件的模板:

import time
import os

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_argument("nwapp=" + os.path.dirname(os.path.abspath(__file__)))

driver = webdriver.Chrome(executable_path=os.environ['CHROMEDRIVER'], chrome_options=chrome_options)
time.sleep(1)
try:
    print driver.current_url
    # 测试代码写在这里(使用 `assert`)
finally:
    driver.quit()

真实用例是一个 NW.js 应用,通过 ChromeDriver 可以模拟鼠标点击事件和输入动作,然后获得一些 DOM 元素的内容。例如下面的代码,点击“点我”按钮,一个内容为“成功”的新 DOM 元素将被添加到 document 中。

<button id="clickme" onclick="success()">点我</button>
<script>
function success() {
    var el = document.createElement('div');
    el.id = 'result';
    el.innerHTML = '成功';
    document.body.appendChild(el);
}
</script>

然后您可以在 test.py 脚本中进行测试:

driver.implicitly_wait(10) # 查找元素超时为 10 秒

clickme = driver.find_element_by_id('clickme')
clickme.click() # 点击按钮

result = driver.find_element_by_id('result')
assert("成功" in result.get_attribute('innerHTML')) # 断言 "成功" 在元素中

运行 Nightly 测试用例

测试之前需要做的准备:

1.下载 NW SDK 版本。

2.从 git 下载用于 NW 的 selenium python 库。
仓库地址和 git commit id 在根目录的 DEPS 文件 管理的依赖 里(如果测试的不是 0.35 版本,把 nw35 替换为对应的分支名)。
在文件的 deps 部分查找 ‘third_party/webdriver/pylib’,找到下面这种格式:

 'src/third_party/webdriver/pylib':
    Var('chromium_git') + '/external/selenium/py.git' + '@' + 'expected commit id',

然后在文件的 vars 部分查找 Var(如 chromium_git)的值。
克隆 pylib 仓库后,确保 commit id 与 expected commit id 相同。

3.设置环境变量。
设置 CHROMEDRIVER 为 NW SDK 中 chromedriver.exe 的路径,设置 PYTHONPATH 为克隆下来的 ‘py’ 文件夹的路径。

4.安装 Python 2.7(如果未安装的话)

5.克隆 nw 源码仓库:nwjs.

然后进入 nw仓库目录/test,运行:

python test.py -d <path to NW SDK> -t 60 sanity